import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Scanner;

// 账单记录类，用于存储每条账单的详细信息
class BillRecord {
    private Date date; // 账单日期
    private double amount; // 账单金额
    private String category; // 账单类别
    private String remark; // 账单备注信息

    // 构造方法，用于创建新的账单记录
    public BillRecord(Date date, double amount, String category, String remark) {
        this.date = date;
        this.amount = amount;
        this.category = category;
        this.remark = remark;
    }

    // Getter方法
    public Date getDate() {
        return date;
    }

    public double getAmount() {
        return amount;
    }

    public String getCategory() {
        return category;
    }

    public String getRemark() {
        return remark;
    }

    // Override toString method to display bill record details
    @Override
    public String toString() {
        return "日期：" + new SimpleDateFormat("yyyy-MM-dd").format(date) + ", 金额：" + amount + ", 类别：" + category + ", 备注：" + remark;
    }
}

// 账单管理类，用于管理账单记录
public class BillManager {
    private List<BillRecord> incomeRecords = new ArrayList<>(); // 存储收入记录的列表
    private List<BillRecord> expenseRecords = new ArrayList<>(); // 存储支出记录的列表
    private Scanner scanner = new Scanner(System.in); // 用于获取用户输入的Scanner对象

    // 记录收入的方法
    public void recordIncome() {
        System.out.println("请输入收入信息：");
        String dateStr = scanner.nextLine();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date = dateFormat.parse(dateStr);
            System.out.print("金额：");
            double amount = scanner.nextDouble();
            scanner.nextLine();
            if (amount <= 0) {
                System.out.println("金额必须为正数，请重新输入。");
                return;
            }
            System.out.print("类别（如工资、奖金等）：");
            String category = scanner.nextLine();
            System.out.print("备注：");
            String remark = scanner.nextLine();

            incomeRecords.add(new BillRecord(date, amount, category, remark));
            System.out.println("收入已成功记录！");
        } catch (ParseException e) {
            System.out.println("错误：非法的日期格式。");
        }
    }

    // 记录支出的方法
    public void recordExpense() {
        System.out.println("请输入支出信息：");
        String dateStr = scanner.nextLine();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date = dateFormat.parse(dateStr);
            System.out.print("金额：");
            double amount = scanner.nextDouble();
            scanner.nextLine();
            if (amount <= 0) {
                System.out.println("金额必须为正数，请重新输入。");
                return;
            }
            System.out.print("类别（如餐饮、交通、购物等）：");
            String category = scanner.nextLine();
            System.out.print("备注：");
            String remark = scanner.nextLine();

            expenseRecords.add(new BillRecord(date, amount, category, remark));
            System.out.println("支出已成功记录！");
        } catch (ParseException e) {
            System.out.println("错误：非法的日期格式。");
        }
    }

    // 展示所有账单记录的方法
    public void displayRecords() {
        System.out.println("所有收入记录：");
        for (BillRecord record : incomeRecords) {
            System.out.println(record);
        }
        System.out.println("所有支出记录：");
        for (BillRecord record : expenseRecords) {
            System.out.println(record);
        }
    }

    // 查询账单的方法
    public void queryRecords() {
        System.out.println("请输入查询日期（格式：yyyy-MM-dd）或日期范围（格式：yyyy-MM-dd yyyy-MM-dd）：");
        String[] dates = scanner.nextLine().split(" ");
        if (dates.length == 1) { // 单个日期查询
            queryByDate(dates[0]);
        } else if (dates.length == 2) { // 日期范围查询
            queryByDateRange(dates[0], dates[1]);
        } else {
            System.out.println("无效的日期格式。");
        }
    }

    // 按单个日期查询账单的方法
    private void queryByDate(String dateStr) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date = dateFormat.parse(dateStr);
            System.out.println("查询结果（" + dateStr + "）：");
            for (BillRecord record : incomeRecords) {
                if (record.getDate().equals(date)) {
                    System.out.println("收入：" + record);
                }
            }
            for (BillRecord record : expenseRecords) {
                if (record.getDate().equals(date)) {
                    System.out.println("支出：" + record);
                }
            }
        } catch (ParseException e) {
            System.out.println("错误：非法的日期格式。");
        }
    }

    // 按日期范围查询账单的方法
    private void queryByDateRange(String startDateStr, String endDateStr) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date startDate = dateFormat.parse(startDateStr);
            Date endDate = dateFormat.parse(endDateStr);
            System.out.println("查询结果（" + startDateStr + " 至 " + endDateStr + "）：");
            for (BillRecord record : incomeRecords) {
                if (record.getDate().after(startDate) && record.getDate().before(endDate)) {
                    System.out.println("收入：" + record);
                }
            }
            for (BillRecord record : expenseRecords) {
                if (record.getDate().after(startDate) && record.getDate().before(endDate)) {
                    System.out.println("支出：" + record);
                }
            }
        } catch (ParseException e) {
            System.out.println("错误：非法的日期格式。");
        }
    }

    // 显示菜单的方法
    public void showMenu() {
        while (true) {
            System.out.println("=================================");
            System.out.println("欢迎使用个人账单管理系统");
            System.out.println("=================================");
            System.out.println("请选择操作：");
            System.out.println("1. 记录收入");
            System.out.println("2. 记录支出");
            System.out.println("3. 展示所有账单");
            System.out.println("4. 查询账单");
            System.out.println("7. 退出系统");

            System.out.print("请输入选项序号：");
            int choice = scanner.nextInt();
            scanner.nextLine();

            switch (choice) {
                case 1:
                    recordIncome();
                    break;
                case 2:
                    recordExpense();
                    break;
                case 3:
                    displayRecords();
                    break;
                case 4:
                    queryRecords();
                    break;
                case 7:
                    System.out.println("感谢使用个人账单管理系统，再见！");
                    scanner.close();
                    System.exit(0);
                    break;
                default:
                    System.out.println("无效选项，请重新输入。");
                    break;
            }
        }
    }

    public static void main(String[] args) {
        BillManager manager = new BillManager();
        manager.showMenu();
    }
}